package Persistencia;

import Entidades.*;
import Negocio.EmpleadoN;
import Persistencia.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

/**
 *
 * @author santiago
 */
public class Daos {

    /**
     *
     * @param con Conexion
     * @param numeroDocumento Cedula del usuario
     * @param clave Clave del usuario
     * @return u , un usuario, solo si existe en la base de datos
     */
    public EntUsuario ValidarUsuario(Connection con, String numeroDocumento, String clave) {
        System.out.println("Validar Usuario DAOS: " + numeroDocumento + " clave: " + clave);
        EntUsuario u = new EntUsuario();
        try {
            PreparedStatement ps = con.prepareStatement("SELECT * FROM usuario WHERE numeroDocumento=? and clave=?");
            ps.setString(1, numeroDocumento);
            ps.setString(2, clave);
            ResultSet r = ps.executeQuery();
            while (r.next()) {
                u.setNumeroDocumento(r.getString(1));
                u.setClave(r.getString(2));
                u.setTipo(r.getString(3));
                u.setNick(r.getString(4));
                return u;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();

            } catch (Exception e) {
            }
        }
        return null;
    }

    //Cliente
    /**
     * Metodo que sirve para registrar un Cliente en la Base de Datos
     *
     * @param con Conexion
     * @param nombres Nombres del cliente
     * @param primerApellido Primer Apellido del cliente
     * @param segundoApellido Segundo Apellido del CLiente
     * @param tipoDocumento Tipo de Documento del Cliente
     * @param numeroDocumento Cedula del cliente
     * @param correo Correo Electronico del Cliente
     * @param clave Clave del Cliente
     * @param ciudad Ciudad natal del cliente
     * @param direccion Direccion de residencia del cliente
     * @param telefono Telefono del cliente
     * @return true , si se inserto con exito, de lo contrario false
     */
    public boolean insertarCliente(Connection con, String nombres, String primerApellido, String segundoApellido, String tipoDocumento, String numeroDocumento, String correo, String clave, String ciudad, String direccion, String telefono) {
        try {
            String sql = SqlHelper.insertarCliente();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, nombres);
            ps.setString(2, primerApellido);
            ps.setString(3, segundoApellido);
            ps.setString(4, tipoDocumento);
            ps.setString(5, numeroDocumento);
            ps.setString(6, correo);
            ps.setString(7, clave);
            ps.setString(8, ciudad);
            ps.setString(9, direccion);
            ps.setString(10, telefono);
            ps.execute();
            PreparedStatement usuario = con.prepareStatement("INSERT into usuario (numeroDocumento, clave, perfil,nick) VALUES('" + numeroDocumento + "','" + clave + "','Cliente','" + nombres + "')");
            usuario.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    /**
     * Metodo que sirve para actualizar la informacion de un cliente en la base
     * de datos
     *
     * @param con Conexion
     * @param nombres Nombres del cliente
     * @param primerApellido Primer Apellido del cliente
     * @param segundoApellido Segundo Apellido del CLiente
     * @param tipoDocumento Tipo de Documento del Cliente
     * @param numeroDocumento Cedula del cliente
     * @param correo Correo Electronico del Cliente
     * @param clave Clave del Cliente
     * @param ciudad Ciudad natal del cliente
     * @param direccion Direccion de residencia del cliente
     * @param telefono Telefono del cliente
     * @return true , si se inserto con exito, de lo contrario false
     */
    public boolean actualizarCliente(Connection con, String nombres, String primerApellido, String segundoApellido, String tipoDocumento, String numeroDocumento, String correo, String clave, String ciudad, String direccion, String telefono) {
        try {
            String sql = SqlHelper.modificarCliente();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, nombres);
            ps.setString(2, primerApellido);
            ps.setString(3, segundoApellido);
            ps.setString(4, tipoDocumento);
            ps.setString(5, numeroDocumento);
            ps.setString(6, correo);
            ps.setString(7, clave);
            ps.setString(8, ciudad);
            ps.setString(9, direccion);
            ps.setString(10, telefono);
            ps.setString(11, numeroDocumento);
            ps.execute();
            PreparedStatement usuario = con.prepareStatement("UPDATE usuario set  clave='" + clave + "' WHERE numeroDocumento='" + numeroDocumento + "'");
            usuario.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    /**
     * Metodo que sirve para consultar la informacion de un cliente
     *
     * @param con Conexion
     * @param numeroDocumento Cedula del Cliente
     * @return cliente
     */
    public EntCliente consultarCliente(Connection con, String numeroDocumento) {
        EntCliente cliente = new EntCliente();
        System.out.println("Consultar Cliente DAOS: " + numeroDocumento);
        try {
            String sql = SqlHelper.consultarCliente();
            PreparedStatement pr = con.prepareStatement(sql);
            pr.setString(1, numeroDocumento);
            ResultSet r = pr.executeQuery();
            while (r.next()) {
                System.out.println("ENtra al While");
                System.out.println("Nombres: " + r.getString(1));
                cliente.setNombres(r.getString(1));
                cliente.setPrimerApellido(r.getString(2));
                cliente.setSegundoApellido(r.getString(3));
                cliente.setTipoDocumento(r.getString(4));
                cliente.setNumeroDocumento(r.getString(5));
                cliente.setCorreo(r.getString(6));
                cliente.setClave(r.getString(7));
                cliente.setCiudad(r.getString(8));
                cliente.setDireccion(r.getString(9));
                cliente.setTelefono(r.getString(10));
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();

            } catch (Exception ex) {
            }
            return cliente;
        }
    }

    /**
     * Metodo que sirve para crear una lista con todos los clientes de la base
     * de datos
     *
     * @param con Conexion
     * @return listaClientes
     */
    public List<EntCliente> listarCliente(Connection con) {
        List<EntCliente> listaClientes = new ArrayList<EntCliente>();
        try {
            String sql = SqlHelper.listarCliente();
            PreparedStatement us = con.prepareStatement(sql);
            ResultSet r = us.executeQuery();
            while (r.next()) {
                EntCliente entCli = new EntCliente(r.getString(1), r.getString(2), r.getString(3), r.getString(4), r.getString(5), r.getString(6), r.getString(7), r.getString(8), r.getString(9), r.getString(10));
                listaClientes.add(entCli);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
        return listaClientes;
    }

    /**
     * Metodo que sirve para borrar un cliente de la base de datos
     *
     * @param con Conexion
     * @param cedula Numero de Documento del cliente
     * @return true, en caso de que la operacion se halla realizado con exito,
     * de lo contrario false
     */
    public boolean borrarCliente(Connection con, String cedula) {
        try {
            String sql = SqlHelper.eliminarCliente(cedula);
            PreparedStatement p = con.prepareStatement(sql);
            p.execute();
            PreparedStatement usuario = con.prepareStatement("DELETE from usuario WHERE numeroDocumento='" + cedula + "'");
            usuario.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    //Empleado
    /**
     * Metodo que sirve para registrar un Empleado en la Base de Datos
     * @param con Conexion
     * @param nombres Nombres del cliente
     * @param primerApellido Primer Apellido del cliente
     * @param segundoApellido Segundo Apellido del CLiente
     * @param tipoDocumento Tipo de Documento del Cliente
     * @param numeroDocumento Cedula del cliente
     * @param correo Correo Electronico del Cliente
     * @param clave Clave del Cliente
     * @param ciudad Ciudad natal del cliente
     * @param direccion Direccion de residencia del cliente
     * @param telefono Telefono del cliente
     * @return true , si se inserto con exito, de lo contrario false
     */
    public boolean insertarEmpleado(Connection con, String nombres, String primerApellido, String segundoApellido, String tipoDocumento, String numeroDocumento, String correo, String clave, String ciudad, String direccion, String telefono) {
        try {
            String sql = SqlHelper.insertarEmpleados();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, nombres);
            ps.setString(2, primerApellido);
            ps.setString(3, segundoApellido);
            ps.setString(4, tipoDocumento);
            ps.setString(5, numeroDocumento);
            ps.setString(6, correo);
            ps.setString(7, clave);
            ps.setString(8, ciudad);
            ps.setString(9, direccion);
            ps.setString(10, telefono);
            ps.execute();
            PreparedStatement usuario = con.prepareStatement("INSERT into usuario (numeroDocumento, clave, perfil,nick) VALUES('" + numeroDocumento + "','" + clave + "','Empleado','" + nombres + "')");
            usuario.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    /**
     * Metodo que sirve para actualizar la informacion de un empleado en la base
     * de datos
     * @param con Conexion
     * @param nombres Nombres del cliente
     * @param primerApellido Primer Apellido del cliente
     * @param segundoApellido Segundo Apellido del CLiente
     * @param tipoDocumento Tipo de Documento del Cliente
     * @param numeroDocumento Cedula del cliente
     * @param correo Correo Electronico del Cliente
     * @param clave Clave del Cliente
     * @param ciudad Ciudad natal del cliente
     * @param direccion Direccion de residencia del cliente
     * @param telefono Telefono del cliente
     * @return true , si se inserto con exito, de lo contrario false
     */
    public boolean actualizarEmpleado(Connection con, String nombres, String primerApellido, String segundoApellido, String tipoDocumento, String numeroDocumento, String correo, String clave, String ciudad, String direccion, String telefono) {
        try {
            System.out.println("Daos Actualizar: " + nombres);
            String sql = SqlHelper.modificarEmpleados();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, nombres);
            ps.setString(2, primerApellido);
            ps.setString(3, segundoApellido);
            ps.setString(4, tipoDocumento);
            ps.setString(5, numeroDocumento);
            ps.setString(6, correo);
            ps.setString(7, clave);
            ps.setString(8, ciudad);
            ps.setString(9, direccion);
            ps.setString(10, telefono);
            ps.setString(11, numeroDocumento);
            ps.execute();
            PreparedStatement usuario = con.prepareStatement("UPDATE usuario set  clave='" + clave + "' WHERE numeroDocumento='" + numeroDocumento + "'");
            usuario.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    /**
     * Metodo que sirve para consultar la informacion de un empleado
     *
     * @param con Conexion
     * @param numeroDocumento Cedula del empleado
     * @return empleado
     */
    public EntEmpleado consultarEmpleado(Connection con, String numeroDocumento) {
        EntEmpleado empleado = new EntEmpleado();
        //System.out.println("Llega al DAOS");
        try {
            String sql = SqlHelper.consultarEmpleados();
            PreparedStatement pr = con.prepareStatement(sql);
            pr.setString(1, numeroDocumento);
            ResultSet r = pr.executeQuery();
            while (r.next()) {
                //System.out.println("***** Daos: "+r.getString(1));
                empleado.setNombres(r.getString(1));
                empleado.setPrimerApellido(r.getString(2));
                empleado.setSegundoApellido(r.getString(3));
                empleado.setTipoDocumento(r.getString(4));
                empleado.setNumeroDocumento(r.getString(5));
                empleado.setCorreo(r.getString(6));
                empleado.setClave(r.getString(7));
                empleado.setCiudad(r.getString(8));
                empleado.setDireccion(r.getString(9));
                empleado.setTelefono(r.getString(10));
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();

            } catch (Exception ex) {
            }
            return empleado;
        }
    }

    /**
     * Metodo que sirve para crear una lista con todos los clientes de la base
     * de datos
     *
     * @param con Conexion
     * @return listaEmpleado
     */
    public List<EntEmpleado> listarEmpleado(Connection con) {
        List<EntEmpleado> listaEmpleado = new ArrayList<EntEmpleado>();
        try {
            String sql = SqlHelper.listarEmpleados();
            PreparedStatement us = con.prepareStatement(sql);
            ResultSet r = us.executeQuery();
            while (r.next()) {
                EntEmpleado entEmple = new EntEmpleado(r.getString(1), r.getString(2), r.getString(3), r.getString(4), r.getString(5), r.getString(6), r.getString(7), r.getString(8), r.getString(9), r.getString(10));
                listaEmpleado.add(entEmple);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
        return listaEmpleado;
    }

    /**
     * Metodo que sirve para borrar un empleado de la base de datos
     * @param con Conexion
     * @param numeroDocumento Cedula del empleado
     * @return true, en caso de que la operacion se halla realizado con exito,
     * de lo contrario false
     */
    public boolean borrarEmpleado(Connection con, String numeroDocumento) {
        try {
            String sql = SqlHelper.eliminarEmpleados(numeroDocumento);
            PreparedStatement p = con.prepareStatement(sql);
            p.execute();
            PreparedStatement usuario = con.prepareStatement("DELETE from usuario WHERE numeroDocumento='" + numeroDocumento + "'");
            usuario.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    //Ingreso Vehiculo
    /**
     * Metodo que sirve para registrar el ingreso de un vehiculo al taller
     *
     * @param con Conexion
     * @param numeroIngreso Numero de ingreso del vehiculo
     * @param fechaIngreso Fecha de ingreso del vehiculo al taller
     * @param documentoCliente Cedula del cliente
     * @param empleadoRecibe Cedula del empleado que recibe el vehiculo
     * @param placa Placa del vehiculo
     * @param marca Marca del vehiculo
     * @param serie Serie del vehiculo
     * @param anho Anho del vehiculo
     * @param kilometraje Kilometraje recorrido del vehiculo
     * @param descripcionNecesidad Descripcion de la necesidad del vehiculo
     * @param estado Estado actual del vehiculo
     * @return true, si se realizo con exito, sino false
     */
    public boolean insertarVehiculo(Connection con, int numeroIngreso, Date fechaIngreso, String documentoCliente, String empleadoRecibe, String placa, String marca, String serie, String anho, String kilometraje, String descripcionNecesidad, String estado) {
        try {
            String sql = SqlHelper.insertarVehiculo();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setInt(1, numeroIngreso);
            ps.setDate(2, new java.sql.Date(fechaIngreso.getTime()));
            ps.setString(3, documentoCliente);
            ps.setString(4, empleadoRecibe);
            ps.setString(5, placa);
            ps.setString(6, marca);
            ps.setString(7, serie);
            ps.setString(8, anho);
            ps.setString(9, kilometraje);
            ps.setString(10, descripcionNecesidad);
            ps.setString(11, estado);
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    /**
     * Metodo que sirve para actualizar la informacion del ingreso de un
     * vehiculo
     * @param con Conexion
     * @param numeroIngreso Numero de ingreso del vehiculo
     * @param fechaIngreso Fecha de ingreso del vehiculo al taller
     * @param documentoCliente Cedula del cliente
     * @param empleadoRecibe Cedula del empleado que recibe el vehiculo
     * @param placa Placa del vehiculo
     * @param marca Marca del vehiculo
     * @param serie Serie del vehiculo
     * @param anho Anho del vehiculo
     * @param kilometraje Kilometraje recorrido del vehiculo
     * @param descripcionNecesidad Descripcion de la necesidad del vehiculo
     * @param estado Estado actual del vehiculo
     * @return true, si se realizo con exito, sino false
     */
    public boolean actualizarVehiculo(Connection con, int numeroIngreso, java.util.Date fechaIngreso, String documentoCliente, String empleadoRecibe, String placa, String marca, String serie, String anho, String kilometraje, String descripcionNecesidad, String estado) {
        try {
            String sql = SqlHelper.modificarVehiculo();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setInt(1, numeroIngreso);
            ps.setDate(2, new java.sql.Date(fechaIngreso.getTime()));
            ps.setString(3, documentoCliente);
            ps.setString(4, empleadoRecibe);
            ps.setString(5, placa);
            ps.setString(6, marca);
            ps.setString(7, serie);
            ps.setString(8, anho);
            ps.setString(9, kilometraje);
            ps.setString(10, descripcionNecesidad);
            ps.setString(11, estado);
            ps.setInt(12, numeroIngreso);
            ps.setString(13, placa);
            ps.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    /**
     * Metodo que sirve para consultar la informacion sobre el ingreso de un
     * vehiculo al taller
     *
     * @param con COnexion
     * @param numeroIngreso Numero de ingreso del vehiculo
     * @param placa Placa del vehiculo
     * @return ingreso
     */
    public EntIngresoVehiculo consultarVehiculo(Connection con, int numeroIngreso, String placa) {
        EntIngresoVehiculo ingreso = new EntIngresoVehiculo();
        try {
            String sql = SqlHelper.consultarVehiculo();
            PreparedStatement pr = con.prepareStatement(sql);
            pr.setString(1, String.valueOf(numeroIngreso));
            pr.setString(2, placa);
            ResultSet r = pr.executeQuery();
            while (r.next()) {
                ingreso.setNumeroIngreso(Integer.parseInt(r.getString(1)));
                ingreso.setFechaIngreso(r.getDate(2) != null ? new java.util.Date(r.getDate(2).getTime()) : null);
                ingreso.setDocumentoCliente(r.getString(3));
                ingreso.setEmpleadoRecibe(r.getString(4));
                ingreso.setPlaca(r.getString(5));
                ingreso.setMarca(r.getString(6));
                ingreso.setSerie(r.getString(7));
                ingreso.setAnho(r.getString(8));
                ingreso.setKilometraje(r.getString(9));
                ingreso.setDescripcionNecesidad(r.getString(10));
                ingreso.setEstado(r.getString(11));
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();

            } catch (Exception ex) {
            }
            return ingreso;
        }
    }

    /**
     * Metodo que sirve para crear una lista con la informacion de los ingresos
     * de vehiculos registrados
     *
     * @param con Conexion
     * @return listaVehiculo
     */
    public List<EntIngresoVehiculo> listarVehiculo(Connection con) {
        List<EntIngresoVehiculo> listaVehiculo = new ArrayList<EntIngresoVehiculo>();
        try {
            String sql = SqlHelper.listarIngresoVehiculo();
            PreparedStatement us = con.prepareStatement(sql);
            ResultSet r = us.executeQuery();
            while (r.next()) {
                EntIngresoVehiculo entVhi = new EntIngresoVehiculo(r.getInt(1), r.getString(3), r.getString(4), r.getString(5), r.getString(6), r.getString(7), r.getString(8), r.getString(9), r.getString(10), r.getString(11));
                entVhi.setFechaIngreso(r.getDate(2));
                listaVehiculo.add(entVhi);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
        return listaVehiculo;
    }

    /**
     * Metodo que sirve para eliminar el ingreso de un vehiculo de la base de
     * datos
     *
     * @param con Conexion
     * @param numeroIngreso Numero de ingreso del vehiculo
     * @return true, si se realizo con exito, sino false
     */
    public boolean borrarVehiculo(Connection con, int numeroIngreso) {
        try {
            String sql = SqlHelper.eliminarVehiculo(numeroIngreso);
            PreparedStatement p = con.prepareStatement(sql);
            p.execute();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
            return true;
        }
    }

    //Consultar Estado
    /**
     * Metodo que sirve para consultar el estado de un vehiculo en el taller
     *
     * @param con Conexion
     * @param numeroIngreso Numero de ingrso del vehiculo
     * @param placa Placa del vehiculo
     * @return 'Ingreso' | 'En Proceso' | 'Terminado'
     */
    public String consultarEstadoVehiculo(Connection con, int numeroIngreso, String placa) {
        try {
            PreparedStatement ps = con.prepareStatement(SqlHelper.consultarEstadoVehiculo(numeroIngreso, placa));
            ResultSet r = ps.executeQuery();
            while (r.next()) {
                return r.getString(1);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

}
